"""
提示词构建模块

负责构建和优化发送给AI模型的提示词。
"""

from typing import List, Optional


class PromptBuilder:
    """提示词构建类"""
    
    def __init__(self) -> None:
        # 系统角色定义
        self.system_role = """你是一个专业的编程助手，专门帮助开发者解决编程问题。

你的能力包括：
- 代码生成和优化
- 代码审查和重构建议
- 技术问题解答
- 最佳实践指导
- 调试帮助

请遵循以下原则：
1. 提供准确、实用的代码示例
2. 解释代码的工作原理
3. 考虑性能和安全性
4. 遵循编程最佳实践
5. 使用清晰、简洁的语言
6. 如果代码有改进空间，请指出并提供建议

请用中文回答，代码注释也使用中文。"""
        
        # 上下文模板
        self.context_template = """
以下是相关的代码文件内容，请基于这些信息来回答：

{context}

---
用户问题：{prompt}
"""
        
        # 无上下文模板
        self.no_context_template = """
用户问题：{prompt}

请提供详细的解答和代码示例。
"""
    
    def build_prompt(self, prompt: str, context_files: Optional[List[str]] = None, 
                    include_history: bool = True, max_history: int = 3) -> str:
        """
        构建完整提示词
        
        Args:
            prompt: 用户提示词
            context_files: 上下文文件列表
            include_history: 是否包含历史对话
            max_history: 最大历史消息数量
            
        Returns:
            构建好的提示词
        """
        # 构建上下文部分
        context_content = ""
        if context_files:
            context_content = self._build_context_content(context_files)
        
        # 构建历史对话部分
        history_content = ""
        if include_history:
            history_content = self._build_history_content(max_history)
        
        # 选择模板
        if context_content:
            template = self.context_template
            final_prompt = template.format(
                context=context_content,
                prompt=prompt
            )
        else:
            template = self.no_context_template
            final_prompt = template.format(prompt=prompt)
        
        # 添加历史对话
        if history_content:
            final_prompt = f"{history_content}\n\n{final_prompt}"
        
        return final_prompt
    
    def _build_context_content(self, context_files: List[str]) -> str:
        """
        构建上下文内容
        
        Args:
            context_files: 上下文文件列表
            
        Returns:
            格式化的上下文内容
        """
        if not context_files:
            return ""
        
        context_parts = []
        for file_path in context_files:
            # 这里应该从ContextManager获取文件内容
            # 暂时使用文件路径作为占位符
            context_parts.append(f"文件: {file_path}")
        
        return "\n".join(context_parts)
    
    def _build_history_content(self, max_history: int) -> str:
        """
        构建历史对话内容
        
        Args:
            max_history: 最大历史消息数量
            
        Returns:
            格式化的历史对话内容
        """
        # 这里应该从ContextManager获取历史记录
        # 暂时返回空字符串
        return ""
    
    def build_code_generation_prompt(self, description: str, language: str = "python", 
                                   requirements: Optional[List[str]] = None) -> str:
        """
        构建代码生成提示词
        
        Args:
            description: 代码功能描述
            language: 编程语言
            requirements: 额外要求列表
            
        Returns:
            代码生成提示词
        """
        prompt = f"""请根据以下描述生成{language}代码：

功能描述：{description}

要求：
- 代码要清晰、易读
- 包含适当的中文注释
- 遵循{language}的最佳实践
- 考虑错误处理和边界情况"""

        if requirements:
            prompt += "\n额外要求：\n" + "\n".join(f"- {req}" for req in requirements)
        
        prompt += "\n\n请提供完整的代码实现。"
        return prompt
    
    def build_code_review_prompt(self, code: str, focus_areas: Optional[List[str]] = None) -> str:
        """
        构建代码审查提示词
        
        Args:
            code: 要审查的代码
            focus_areas: 重点审查领域
            
        Returns:
            代码审查提示词
        """
        prompt = f"""请对以下代码进行审查：

```python
{code}
```

请从以下方面进行审查："""

        if focus_areas:
            prompt += "\n" + "\n".join(f"- {area}" for area in focus_areas)
        else:
            prompt += """
- 代码质量和可读性
- 性能和效率
- 安全性
- 错误处理
- 最佳实践遵循
- 可维护性"""

        prompt += "\n\n请提供详细的审查意见和改进建议。"
        return prompt
    
    def build_explanation_prompt(self, code: str, aspect: str = "功能") -> str:
        """
        构建代码解释提示词
        
        Args:
            code: 要解释的代码
            aspect: 解释的方面（功能、原理、逻辑等）
            
        Returns:
            代码解释提示词
        """
        return f"""请解释以下代码的{aspect}：

```python
{code}
```

请详细说明：
1. 代码的主要{aspect}
2. 关键部分的工作原理
3. 重要的变量和函数的作用
4. 代码的执行流程

请用通俗易懂的语言进行解释。"""
    
    def build_debug_prompt(self, code: str, error_message: str, 
                          expected_behavior: str) -> str:
        """
        构建调试提示词
        
        Args:
            code: 有问题的代码
            error_message: 错误信息
            expected_behavior: 期望的行为
            
        Returns:
            调试提示词
        """
        return f"""请帮助调试以下代码：

代码：
```python
{code}
```

错误信息：
{error_message}

期望行为：
{expected_behavior}

请：
1. 分析错误原因
2. 提供修复方案
3. 解释修复原理
4. 提供改进建议"""
    
    def optimize_prompt(self, prompt: str, max_length: int = 4000) -> str:
        """
        优化提示词长度
        
        Args:
            prompt: 原始提示词
            max_length: 最大长度
            
        Returns:
            优化后的提示词
        """
        if len(prompt) <= max_length:
            return prompt
        
        # 简单的截断策略
        return prompt[:max_length] + "..."
